/*
实际开发中， 经常遇到一种情况： 不知道或者不想区分， 函数f是同步函数还是异步操作， 但是想用 Promise 来处理它。 
因为这样就可以不管f是否包含异步操作， 都用then方法指定下一步流程， 用catch方法处理f抛出的错误。 一般就会采用下面的写法。
*/
Promise.resolve().then(f)
//上面的写法有一个缺点， 就是如果f是同步函数， 那么它会在本轮事件循环的末尾执行。
const f = () => console.log('now');
Promise.resolve().then(f);
console.log('next');
// next 同步任务
// now  微任务


/*那么有没有一种方法， 让同步函数同步执行， 异步函数异步执行， 并且让它们具有统一的 API 呢？
 回答是可以的， 并且还有两种写法。 第一种写法是用async函数来写。
*/



/*
第二行是一个立即执行的匿名函数，会立即执行里面的async函数，因此如果f是同步的，就会得到同步的结果；
*/
const f = () => console.log('now');
(async () => f())(); //加上async的前缀并且使用IIFF(立即执行函数)=>判断是同步任务还是微任务 如果是异步的，就可以用then指定下一步
console.log('next');
// now
// next



/*
如果f是异步的，就可以用then指定下一步，就像下面的写法。
*/
(async () => f())()
.then(...)



//需要注意的是，async () => f()会吃掉f()抛出的错误。所以，如果想捕获错误，要使用promise.catch方法。
(async () => f())()
.then(...)
	.catch(...)



/*
第二种写法是使用new Promise()。
下面代码也是使用立即执行的匿名函数，执行new Promise()。这种情况下，同步函数也是同步执行的。
*/
const f = () => console.log('now');
(
	() => new Promise(
		resolve => resolve(f())
	)
)();
console.log('next');
// now
// next

//回顾 async加IIFF  new promise加IIFF


//目前 promise.try还在提案中没有放出来 后续再学习相关细节
